#include <QtGui>
#include <QString>
#include <QDateTime>
#include "mainwindow.h"

MainWindow::MainWindow(QWidget* pwgt) : QWidget(pwgt)
{
	QCompleter *completer;
	printer = new QPrinter;
	numberAxles = 0;
	numberCar = 0;
	//Задаем кодек (мы пишем на UTF-8)
	QTextCodec *codec = QTextCodec::codecForName("UTF-8");
	//Задаем название окна
	setWindowTitle(codec->toUnicode ("Электронные весы"));
	//Добавление меню
	QMenuBar* menubar = new QMenuBar;
	//действия для меню "файл"
	QAction* openAct = new QAction(codec->toUnicode("Открыть"),0);
	QAction* saveAct = new QAction(codec->toUnicode("Сохранить"),0);
	QAction* printAct = new QAction(codec->toUnicode("Печать"),0);
	QAction* exitAct = new QAction(codec->toUnicode("Выход"),0);
	connect(openAct, SIGNAL(triggered()), this, SLOT(openSlot()));
	connect(saveAct, SIGNAL(triggered()), this, SLOT(saveSlot()));
	connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
	connect(printAct, SIGNAL(triggered()), this, SLOT(printSlot()));
	//действия для меню "правка"
	QAction* cleanAct = new QAction(codec->toUnicode("Удалить строчку"),0);
	connect(cleanAct, SIGNAL(triggered()), this, SLOT(cleanSlot()));
	//создать меню Файл и добавить действия
	QMenu* mfile = new QMenu(codec->toUnicode("Файл"));
	QMenu* mEdit = new QMenu(codec->toUnicode("Правка"));
	mfile->addAction(openAct);
	mfile->addAction(saveAct);
	mfile->addAction(printAct);
	mfile->addAction(exitAct);
	mEdit->addAction(cleanAct);
	menubar->addMenu(mfile);
	menubar->addMenu(mEdit);
	
	QHBoxLayout* labelLayout1 = new QHBoxLayout;
	labelLayout1->addWidget(new QLabel(codec->toUnicode("№ п.п.")),1);
	labelLayout1->addWidget(new QLabel(codec->toUnicode("Дата")),2);
	labelLayout1->addWidget(new QLabel(codec->toUnicode("Время")),2);
	
	//номер ПП дата и время
	QHBoxLayout* ppDateTimeLayout = new QHBoxLayout;
	QLineEdit* ppEdit = new QLineEdit;
	dateTimeEdit = new QLineEdit;
	dateTimeEdit->setReadOnly(true);
	QFont font;
	font.setBold(true);
	dateTimeEdit->setFont(font);
	ppDateTimeLayout->addWidget(ppEdit,1);
	ppDateTimeLayout->addWidget(dateTimeEdit,4);
	
	QTimer* timer = new QTimer(this);
	connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));
	timer->start(1000);
	showTime();
	
	//метка отображающая вес текущей оси
	QHBoxLayout* ves = new QHBoxLayout;
	ves->addWidget(new QLabel(codec->toUnicode("Вес:")));
	vesLabel = new QLabel(QString("0"));
	ves->addWidget(vesLabel);
	ves->addWidget(new QLabel(codec->toUnicode("[Кг]")));
	
	//кнопки "Записать вес оси" и "сосчитать"
	QHBoxLayout* pushLayout = new QHBoxLayout;
	loadData = new QPushButton(codec->toUnicode("Записать вес оси"));
	connect(loadData,SIGNAL(clicked()),this,SLOT(loadDataSlot()));
	summ = new QPushButton(codec->toUnicode("Сосчитать"));
	summ->setEnabled(false);
	connect(summ,SIGNAL(clicked()),this,SLOT(summSlot()));
	pushLayout->addWidget(loadData,2);
	pushLayout->addWidget(summ,1);
	
	//Верхняя таблица(данные взвешивания автомобилей)
	QStringList lst1;
	lst1 << codec->toUnicode("№ Машины") << codec->toUnicode("ФИО Водителя")<< codec->toUnicode("№ Накладной")<< codec->toUnicode("Поставщик")<< codec->toUnicode("Получатель")<< codec->toUnicode("Наименование груза")<< codec->toUnicode("Вес автомобиля")<< codec->toUnicode("Кол-во осей")<< codec->toUnicode("Время взвешивания");
	topTable = new QTableWidget(20, 9);
	topTable->setHorizontalHeaderLabels(lst1);

	//Нижняя таблица (взвешивание по осям)
	QStringList lst2;
	lst2 << codec->toUnicode("Номер оси") << codec->toUnicode("Вес оси [Кг.]")<< codec->toUnicode("Скорость [Км./ч.]");
	bottomTable = new QTableWidget(6, 3);
	bottomTable->setHorizontalHeaderLabels(lst2);
	for(int i=0;i<6;i++)
	{
		bottomTable->setItem(i,0,new QTableWidgetItem);
		bottomTable->setItem(i,1,new QTableWidgetItem);
		bottomTable->setItem(i,2,new QTableWidgetItem);
	}
	//Создаем радио кнопки

	//Группа радио кнопок "на весах"
	QGroupBox* onScales = new QGroupBox(codec->toUnicode("На весах"));
	QVBoxLayout* onScalesLayout = new QVBoxLayout;
	brutto =  new QRadioButton(codec->toUnicode("Брутто (Гружёный)"));
	tara = new QRadioButton(codec->toUnicode("Тара (Пустой)"));
	tara->setChecked(true);
	onScalesLayout->addWidget(brutto);
	onScalesLayout->addWidget(tara);
	onScales->setLayout(onScalesLayout);
	
	//Группа радио кнопок "Режим работы"
	QGroupBox* regime = new QGroupBox(codec->toUnicode("Режим работы"));
	QVBoxLayout* regimeLayout = new QVBoxLayout;
	avtomat = new QRadioButton(codec->toUnicode("Автоматический"));
	avtomat->setEnabled(false);
	manual = new QRadioButton(codec->toUnicode("Ручной"));
	manual->setChecked(true);
	regimeLayout->addWidget(avtomat);
	regimeLayout->addWidget(manual);
	regime->setLayout(regimeLayout);
	
	QHBoxLayout* hb1 = new QHBoxLayout;
	hb1->addWidget(new QLabel(codec->toUnicode("№ Накладной")),2);
	hb1->addWidget(new QLabel(codec->toUnicode("№ Автомобиля")),4);
	
	//поля ввода: номер водителя и номер накладной	
	QHBoxLayout* hb2 = new QHBoxLayout;
	naklad = new QLineEdit;
	avto = new QComboBox;
	avto->setDuplicatesEnabled(false);
	avto->setEditable(true);
	completer = avto->completer();
	completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel);
//	completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
	completer->setCompletionMode(QCompleter::InlineCompletion);
	hb2->addWidget(naklad,2);
	hb2->addWidget(avto,4);
	
	//поле ввода фио водителя
	fio = new QComboBox;
	fio->setDuplicatesEnabled(false);
	fio->setEditable(true);
	completer = fio->completer();
	completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel);
	completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion);
	//поле ввода отправитель
	otprav = new QComboBox;
	otprav->setDuplicatesEnabled(false);
	otprav->setEditable(true);
	completer = otprav->completer();
	completer->setModelSorting(QCompleter::CaseInsensitivelySortedModel);
	completer->setCompletionMode(QCompleter::PopupCompletion);
	//поле ввода получатель
	poluch = new QLineEdit;
	//поле ввода груз
	gruz = new QLineEdit;
	
	//Задаем расположение компонентов окна
	//Левый лайоут
	QBoxLayout* vLayout1 = new QBoxLayout(QBoxLayout::TopToBottom);
//	vLayout1->addWidget(menubar);
	vLayout1->addLayout(labelLayout1);
	vLayout1->addLayout(ppDateTimeLayout);
	vLayout1->addLayout(ves);
	vLayout1->addLayout(pushLayout);
	//Задаем расположение радио кнопок
	vLayout1->addWidget(onScales);
	vLayout1->addWidget(regime);
	vLayout1->addLayout(hb1);
	vLayout1->addLayout(hb2);
	vLayout1->addWidget(new QLabel(codec->toUnicode("Ф.И.О. Водителя")));
	vLayout1->addWidget(fio);
	vLayout1->addWidget(new QLabel(codec->toUnicode("Отправитель(поставщик)")));
	vLayout1->addWidget(otprav);
	vLayout1->addWidget(new QLabel(codec->toUnicode("Получатель")));
	vLayout1->addWidget(poluch);
	vLayout1->addWidget(new QLabel(codec->toUnicode("Груз")));
	vLayout1->addWidget(gruz);
	
	//Лайоут с таблицами(правый)
	QVBoxLayout* vLayout2 = new QVBoxLayout;
	vLayout2->addWidget(topTable,2);
	vLayout2->addWidget(bottomTable,1);
	
	QHBoxLayout* mainLayout = new QHBoxLayout;
	mainLayout->addLayout(vLayout1,1);
	mainLayout->addLayout(vLayout2,4);
	
	QVBoxLayout* layout = new QVBoxLayout;
	layout->addWidget(menubar);
	layout->addLayout(mainLayout);
	
	setLayout(layout);
	

}

void MainWindow::showTime()
{
	QDateTime dateTime = QDateTime::currentDateTime();
	dateTimeEdit->setText(dateTime.toString("dd/MM/yyyy hh:mm:ss"));
}

void MainWindow::comSlot(int vesAxles)
{
	vesLabel->setText(tr("%1").arg(vesAxles));
}
//слот загузки веса оси из com порта
void MainWindow::loadDataSlot()
{
	numberAxles++;
	bottomTable->item(numberAxles-1,0)->setText(tr("%1").arg(numberAxles));
	bottomTable->item(numberAxles-1,1)->setText(vesLabel->text());
	//разблокировка кнопки "Сосчитать"
	summ->setEnabled(true);
}
//слот подсчета веса автомобиля
void MainWindow::summSlot()
{
	numberCar++;
	int vesAvto=0;
	for (int i=0;i<numberAxles;i++)
	{
		vesAvto=vesAvto+(bottomTable->item(i,1)->text()).toInt();
	}
	QString onScales;
	if (brutto->isChecked())
	{
		onScales = brutto->text();
	}
	else
	{
		onScales = tara->text();
	}
	loadTopTable(numberCar, avto->currentText(), fio->currentText(), naklad->text(), otprav->currentText(), poluch->text(), gruz->text(), onScales + tr(" %1").arg(vesAvto), tr("%1").arg(numberAxles), dateTimeEdit->text());
	for (int i = 0; i<numberAxles; i++)
	{
		bottomTable->item(i,0)->setText("");
		bottomTable->item(i,1)->setText("");
		bottomTable->item(i,2)->setText("");
	}
	numberAxles = 0;
	//После подсчета массы, блокируем нопку "Сосчитать"
	summ->setEnabled(false);
}

void MainWindow::saveSlot()
{
	QTextCodec *codec = QTextCodec::codecForName("UTF-8");
	QDateTime dateTime = QDateTime::currentDateTime();
	QDir directory(QDir::current());
	//проверяем, существует-ли директория
	qDebug()<< codec->toUnicode("проверяем, существует-ли директория") << endl;
	if(directory.exists(dateTime.toString("yyyy-MM")))
	{
		qDebug()<< codec->toUnicode("существует! тогда переходим в неё и проверяем существует-ли файл") << endl;
		//существует! тогда переходим в неё и проверяем существует-ли файл
		directory.cd(dateTime.toString("yyyy-MM"));
		QFile file(QString(dateTime.toString("yyyy-MM")+"/"+dateTime.toString("dd")));
		qDebug()<< codec->toUnicode("существует, тогда открываем его для записи") << endl;
		qDebug()<< QString(dateTime.toString("yyyy-MM")+"/"+dateTime.toString("dd"));
		//существует, тогда открываем его для записи
		if(file.open(QIODevice::WriteOnly))
		{
			qDebug()<< codec->toUnicode("файл открыт для записи") << endl;
			writeFile(&file);
			file.close();
		}
		else
		{
			qDebug()<< codec->toUnicode("ошибка открытия файла для записи") << endl;
		}
	}
	else
	{
		if(directory.mkdir(dateTime.toString("yyyy-MM")))
		{
			directory.cd(dateTime.toString("yyyy-MM"));
			QFile file(QString(dateTime.toString("yyyy-MM")+"/"+dateTime.toString("dd")));
			//существует, тогда открываем его для записи
			if(file.open(QIODevice::WriteOnly))
			{
				writeFile(&file);
				file.close();
			}
			
		}
		
	}
}

void MainWindow::writeFile(QFile *file)
{
	QTextCodec *codec = QTextCodec::codecForName("UTF-8");
	QTextStream textStream(file);
	for (int i=0;i<numberCar;i++)
	{
		for(int j=0;j<9;j++)
		{
			if(j<8)
			{
				textStream << topTable->item(i,j)->text() << "|";
			}
			else
			{
				textStream << topTable->item(i,j)->text();
				textStream << endl;
			}
			if(textStream.status() != QTextStream::Ok)
			{
				qDebug() << codec->toUnicode("ошибка записи в поток");
			}
		}
	}
}

void MainWindow::openSlot()
{
	QTextCodec *codec = QTextCodec::codecForName("UTF-8");
	numberCar = 0;
	QString filePath = QFileDialog::getOpenFileName(this); 
	QFile file(filePath);
	if(file.open(QIODevice::ReadOnly))
	{
		qDebug()<< codec->toUnicode("файл открыт для чтения") << endl;
		QTextStream stream(&file);
		QString str;
		while(!stream.atEnd())
		{
			numberCar++;
			str = stream.readLine();
			QStringList stringList;
			stringList = str.split("|");
			loadTopTable(numberCar, stringList.at(0), stringList.at(1),  stringList.at(2), stringList.at(3), stringList.at(4), stringList.at(5), stringList.at(6), stringList.at(7), stringList.at(8));
		}
		file.close();
	}
	else
	{
		qDebug()<< codec->toUnicode("ошибка открытия файла для чтения") << endl;
	}
}

void MainWindow::printSlot()
{
	QTextCodec *codec = QTextCodec::codecForName("UTF-8");
	QPrintDialog printDialog(printer,this);
	printDialog.setMinMax(1,1);
	if (printDialog.exec() == QDialog::Accepted)
	{
		//печатаем
	//	topTable->item(topTable->currentRow(),i)->text();
	//	topTable->currentRow();
		qDebug() << printer;
		QString doc;
	//	doc += codec->toUnicode("№ записи П/П	000") + codec->toUnicode("	№ Авто	") + topTable->item(topTable->currentRow(),0)->text() + "\n";
		doc += codec->toUnicode("№ записи П/П		000") + codec->toUnicode("	№ Авто	") + topTable->item(topTable->currentRow(),0)->text() + "\n";
		doc += codec->toUnicode("Сопровод. док. №	000") + codec->toUnicode("	Водитель		") + topTable->item(topTable->currentRow(),1)->text() + "\n";
		doc += codec->toUnicode("Поставщик		") + topTable->item(topTable->currentRow(),3)->text() + "\n";
		doc += codec->toUnicode("Грузополучатель	") + topTable->item(topTable->currentRow(),4)->text() + "\n";
		doc += codec->toUnicode("Груз			") + topTable->item(topTable->currentRow(),5)->text() + "\n";
		doc += codec->toUnicode("Дата взвешивания	") + topTable->item(topTable->currentRow(),5)->text() + "\n";
		doc += topTable->item(topTable->currentRow(),6)->text() + "\n\n";
		doc += codec->toUnicode("Отметка весовщика:____________________________");
		QTextDocument textDocument;
		textDocument.setPlainText(doc);
		textDocument.print(printer);
	}
}

void MainWindow::loadTopTable(int numberCar, const QString & avto, const QString & fio, const QString & naklad, const QString & otprav, const QString & poluch, const QString & gruz, const QString & vesAvto, const QString & numberAxles, const QString &dateTime)
{
	if (topTable->item(numberCar-1,0)==0x00)
	{
		topTable->setItem(numberCar-1,0,new QTableWidgetItem(avto));
		topTable->setItem(numberCar-1,1,new QTableWidgetItem(fio));
		topTable->setItem(numberCar-1,2,new QTableWidgetItem(naklad));
		topTable->setItem(numberCar-1,3,new QTableWidgetItem(otprav));
		topTable->setItem(numberCar-1,4,new QTableWidgetItem(poluch));
		topTable->setItem(numberCar-1,5,new QTableWidgetItem(gruz));
		topTable->setItem(numberCar-1,6,new QTableWidgetItem(vesAvto));
		topTable->setItem(numberCar-1,7,new QTableWidgetItem(numberAxles));
		topTable->setItem(numberCar-1,8,new QTableWidgetItem(dateTime));
	}
	else
	{
		topTable->item(numberCar-1,0)->setText(avto);
		topTable->item(numberCar-1,1)->setText(fio);
		topTable->item(numberCar-1,2)->setText(naklad);
		topTable->item(numberCar-1,3)->setText(otprav);
		topTable->item(numberCar-1,4)->setText(poluch);
		topTable->item(numberCar-1,5)->setText(gruz);
		topTable->item(numberCar-1,6)->setText(vesAvto);
		topTable->item(numberCar-1,7)->setText(numberAxles);
		topTable->item(numberCar-1,8)->setText(dateTime);
	}
}
//слот удаления строчки в верхней таблице
void MainWindow::cleanSlot()
{
	//Удаляем выделенную строчку
	for (int i=0; i<9; i++)
	{
		topTable->item(topTable->currentRow(),i)->setText("");
	}
	//Сдвигаем следующую строчку вверх (если она есть)
	//int i = 0;
	for (int i=topTable->currentRow()+1; topTable->item(i,0)!=0x00; i++)
	{
		for (int j=0; j<9; j++)
		{
			topTable->item(i-1,j)->setText(topTable->item(i,j)->text());
			topTable->item(i,j)->setText("");
		}
	//	i++;
	}
}

MainWindow::~MainWindow()
{
	saveSlot();
	delete printer;
}
